#ifndef __NOLOCK_LIST_H__
#define __NOLOCK_LIST_H__

#include <stdatomic.h>
#include <stdlib.h>
#include <stdbool.h>
#include "public.h"

// ===============无锁环形队列===============
// 用于日志的异步写入


typedef void* (*THREAD_FUNC)(void *);


// 链表节点结构
typedef struct NOLOCK_Node
{
    void *data;               // 存储的数据
    struct NOLOCK_Node *next; // 下一个节点（非原子，因单生产者修改）
} NOLOCK_Node;

// 无锁队列结构（单生产者-单消费者）
// 无锁队列结构（单生产者-单消费者）
typedef struct
{
    _Atomic(NOLOCK_Node *) head; // 消费者指针（原子类型）
    _Atomic(NOLOCK_Node *) tail; // 生产者指针（原子类型）
    NOLOCK_Node *sentinel;       // 哨兵节点（初始化用，固定不变）
    _Atomic(int) task_count;     // 队列中未处理的任务数（原子计数）
} SPSCLockFreeListQueue;

SPSCLockFreeListQueue *spsc_list_queue_init();
int spsc_list_queue_enqueue(SPSCLockFreeListQueue *queue, void *data);
void *spsc_list_queue_dequeue(SPSCLockFreeListQueue *queue);
void spsc_list_queue_destroy(SPSCLockFreeListQueue *queue);


#endif